package com.suke.czx.modules;

import cn.hutool.core.util.StrUtil;

import java.util.*;

/**
 * 应用模块名称: 电平测试程序
 * 代码描述: 电平测试程序,至多2次输入,优先级1,2,3依此递增
 * copyright: WEGO ALL RIGHTS RESERVED
 * company: WEGO
 *
 * @author: 颜米晨
 * @date: 2022/02/22 21:50
 */
public class DigitalDemo {

    /**
     * 第一次输入值
     */
    private static int firstInput;

    /**
     * 第二次输入值
     */
    private static int secondInput;

    /**
     * 两次输入中,第一次输入与第二次输入间隔秒数
     */
    private static long passSecond;

    /**
     * 输入输出端内部类
     */
    class IoTerminal {

        /**
         * 输入端等级名称
         */
        private int level;

        /**
         * 输出端状态,初始值为off
         */
        private String states = "off";

        public int getLevel() {
            return level;
        }

        public void setLevel(int level) {
            this.level = level;
        }

        public String getStates() {
            return states;
        }

        public void setStates(String states) {
            this.states = states;
        }

    }

    /**
     * 三个输入输出对象
     */
    private IoTerminal io1 = new IoTerminal();
    private IoTerminal io2 = new IoTerminal();
    private IoTerminal io3 = new IoTerminal();

    /**
     * 输入输出端对象数据集
     */
    private List<IoTerminal> list = Arrays.asList(io1, io2, io3);

    /**
     * 输入计次
     */
    private int ops;

    public static void main(String[] args) throws InterruptedException {
        System.out.println("请输入数字,程序执行的过程中您还可以输入一次其他数字,仅支持数字1,2,3");
        DigitalDemo digitalDemo = new DigitalDemo();
        // 当前数字
        int nowLevel;
        // 定时器对象
        Timer timer1 = new Timer();
        Timer timer2 = new Timer();
        Timer again = new Timer();
        // 记录第一输入开始的时间戳
        long firstInputStart = 0;
        // 循环执行操作
        do {
            // 创建输入对象等待输入口输入
            Scanner sc = new Scanner(System.in);
            try {
                nowLevel = sc.nextInt();
            } catch (Exception e) {
                System.out.println("输入的只能数字");
                continue;
            }
            if (nowLevel != 1 && nowLevel != 2 && nowLevel != 3) {
                System.out.println("输入的只能数字1,2,3");
                continue;
            }
            // 记录操作次数
            digitalDemo.ops++;
            switch (digitalDemo.ops){
                case 1: firstInput = nowLevel;
                        firstInputStart = System.currentTimeMillis();
                        break;
                case 2: secondInput = nowLevel;
                        passSecond = System.currentTimeMillis() - firstInputStart;
                        break;
                default:
                        break;
            }
            if (secondInput == 0 || firstInput > secondInput) {
                // 仅第一次输入
                digitalDemo.list.get(nowLevel - 1).setLevel(nowLevel);
                // 修改输出端状态为on
                digitalDemo.list.get(nowLevel - 1).setStates("on");
                // 每隔一秒执行一次
                timer1.schedule(new Task(nowLevel, digitalDemo, 10), 0, 1000);
            } else if (firstInput < secondInput) {
                // 第一次输入后,又进行第二次输入,并且第二次输入优先级更高
                // 暂停第一次输入的高电平输出并停止暂停计时器
                digitalDemo.list.get(firstInput - 1).setStates("off");
                timer1.cancel();
                // 修改第二次高优先级的状态
                digitalDemo.list.get(nowLevel - 1).setLevel(nowLevel);
                digitalDemo.list.get(nowLevel - 1).setStates("on");
                // 启动高优先级输入的定时器,计时10s
                timer2.schedule(new Task(nowLevel, digitalDemo, 10), 0, 1000);
                // 暂停主程序10s
                Thread.sleep(10000);
                // 继续第一次输入未完成的计时任务直至达到10s
                digitalDemo.list.get(firstInput - 1).setStates("on");
                again.schedule(new Task(firstInput, digitalDemo, 10 - (int)(passSecond / 1000L) - 1), 0, 1000);
            }
        } while(StrUtil.equals(digitalDemo.io1.getStates(), "on") || StrUtil.equals(digitalDemo.io2.getStates(), "on") ||
                StrUtil.equals(digitalDemo.io3.getStates(), "on"));
    }

    /**
     * 定时任务
     */
    static class Task extends TimerTask {

        /**
         * 当前输入值
         */
        private int nowLevel;

        /**
         * 当前执行类对象
         */
        private DigitalDemo digitalDemo;

        /**
         * 执行时长
         */
        private int second;

        private Task(int nowLevel, DigitalDemo digitalDemo, int second) {
            this.nowLevel = nowLevel;
            this.digitalDemo = digitalDemo;
            this.second = second;
        }

        /**
         * 定时计次值
         */
        int i = 1;

        @Override
        public void run() {
            System.out.println("输出口" + nowLevel + "是高电平，其余是低电平");
            //当执行到规定秒数,修改当前输出端状态为off,结束当前计时
            if (i++ == second) {
                digitalDemo.list.get(nowLevel - 1).setStates("off");
                cancel();
            }
        }
    }

}
